﻿using System;
using System.Linq;
using System.Text;
using Spring.Data.Core;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using Spring.Data;
using Spring.Data.Common;
using GestionadorBaseDatos;
using CRUD.InterfaceDAO;
namespace CRUD.DAO
{
    public class EventoDao : AdoDaoSupport, IDaoEvento
    {
        /// <summary>
        /// Strings con los distintos sql usados en las consultas
        /// </summary>
        #region Querys para metodos
        private string sqlUpdate = @"update evento set estado = @estado where idEvento = @idEvento";
        private string sqlFecha = "select idEvento, fechaIniApuesta, fechaHoraMaxApuesta, nombreEvento, fechaEvento, estado, idCategoria from evento where fechaEvento>=Now() group by idCategoria order by fechaEvento";
        private string sqlById = @"select idEvento, fechaIniApuesta, fechaHoraMaxApuesta, nombreEvento, fechaEvento, estado, idCategoria from evento where idEvento = @idEvento";
        private string sqlByCategoria = "select idEvento, fechaIniApuesta, fechaHoraMaxApuesta, nombreEvento, fechaEvento, estado, idCategoria from evento where idCategoria = @idCategoriaFk";
        private string sql = "select idEvento, fechaIniApuesta, fechaHoraMaxApuesta, nombreEvento, fechaEvento, estado, idCategoria from evento";
        private string sqlInsert = "INSERT INTO evento (fechaIniApuesta, fechaHoraMaxApuesta, nombreEvento, fechaEvento, estado, idCategoria) VALUES (@fechaIniApuesta, @fechaHoraMaxApuesta, @nombreEvento, @fechaEvento, @estado, @idCategoria)";
        private string sqlDia = "select idEvento, fechaIniApuesta, fechaHoraMaxApuesta, nombreEvento, fechaEvento, estado, idCategoria from evento where fechaEvento = @fechaEvento";
        
        # endregion

        # region metodos
        /// <summary>
        /// metodo para updatear un eevneto
        /// </summary>
        /// <param name="u">Datos a modificar del evento</param>
        public void Update(Evento u)
        {

            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@idEvento", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = u.IdEvento;
            dbParameters.Add("@estado", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = u.Estatus;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlUpdate, dbParameters);
        }

        /// <summary>
        /// Metodo para consultar todos los eventos
        /// </summary>
        /// <returns>lista de eventos</returns>
        public virtual IList GetAll()
        {
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sql, new EventoRowMapper());
        }

        /// <summary>
        /// Lista de eventos obtenidos segun una fecha
        /// </summary>
        /// <returns>Lista de eventos segun una fecha</returns>
        public virtual IList GetEventoFecha()
        {
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlFecha, new EventoRowMapper());
           
        }

        /// <summary>
        /// metodo para insertar un evento nuevo
        /// </summary>
        /// <param name="crear">Evento con los datos a agregar</param>
        public void Insert(Evento crear)
        {

            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@fechaIniApuesta", MySql.Data.MySqlClient.MySqlDbType.DateTime, 50).Value = crear.FechaIniApuesta;
            dbParameters.Add("@fechaHoraMaxApuesta", MySql.Data.MySqlClient.MySqlDbType.DateTime, 50).Value = crear.FechaHoraMaxApuesta;
            dbParameters.Add("@nombreEvento", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.NombreEvento;
            dbParameters.Add("@fechaEvento", MySql.Data.MySqlClient.MySqlDbType.DateTime, 50).Value = crear.FechaEvento;
            dbParameters.Add("@estado", MySql.Data.MySqlClient.MySqlDbType.String, 50).Value = crear.Estatus;
            dbParameters.Add("@idcategoria",MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = crear.CategoriaAsociada.IdCategoria;
            AdoTemplate.ExecuteNonQuery(CommandType.Text, sqlInsert, dbParameters);


        }

        /// <summary>
        /// Metodo devuelve evento segun el id buscado
        /// </summary>
        /// <param name="idEvento">id del evento a buscar</param>
        /// <returns>evento buscado</returns>
        public Evento GetById(int idEvento)
        {
            return (Evento)AdoTemplate.QueryForObject(CommandType.Text, sqlById, new EventoRowMapper(), "@idEvento", DbType.Int32, 30, idEvento);
        }

        /// <summary>
        /// Lista de eventos dada una categoria
        /// </summary>
        /// <param name="idCategoria">idcategoria para buscar evento</param>
        /// <returns>lista de eventos de una categoria</returns>
        public virtual IList GetByCategoria(int idCategoria)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();
            dbParameters.Add("@idCategoriaFk", MySql.Data.MySqlClient.MySqlDbType.Int32, 50).Value = idCategoria;
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlByCategoria, new EventoRowMapper(),dbParameters);           
        }

        /// <summary>
        /// Lista de eventos segun un dia
        /// </summary>
        /// <param name="even">evento con parametro</param>
        /// <returns></returns>
        public IList GetByDia(Evento even)
        {
            IDbParameters dbParameters = AdoTemplate.CreateDbParameters();

            dbParameters.Add("@fechaEvento", MySql.Data.MySqlClient.MySqlDbType.Datetime, 50).Value = even.FechaEvento; ;
           
            return (IList)AdoTemplate.QueryWithRowMapper(CommandType.Text, sqlDia, new EventoRowMapper(), dbParameters);
        }


        # endregion
    }
}
